package com.itheima.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.aliyuncs.exceptions.ClientException;
import com.itheima.constant.MessageConstant;
import com.itheima.constant.RedisMessageConstant;
import com.itheima.entity.Result;
import com.itheima.service.EditUserService;
import com.itheima.utils.SMSUtils;
import com.itheima.utils.ValidateCodeUtils;
import com.itheima.vo.LoginInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.Cookie;

/**
 * @author zbw
 * @describe
 * @email 1030184932@qq.com
 * @create 2020-09-25-15:44
 */
//用于修改账号密码的控制层
    @RestController
    @RequestMapping("/edit")
public class EditUserController {
     @Reference
     private EditUserService editUserService;
//        注入加盐加密对象
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

    @Autowired
    private JedisPool jedisPool;
    @RequestMapping("sendCodeFroEdit")
    private Result sendCodeFroLogin(String telephone){
        Jedis resource=null;
        try {
//        产生验证码
            String code = ValidateCodeUtils.generateValidateCode4String(4);
//        第一步:用户发送验证码
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);
//            第二步将验证码方法Redis中设置有效期
            resource = jedisPool.getResource();
            resource.setex(telephone+RedisMessageConstant.SENDTYPE_GETPWD,3600*2*2,code);
//          返回结果
            return new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);
        } catch (ClientException e) {
            e.printStackTrace();
            return new Result(false,MessageConstant.SEND_VALIDATECODE_FAIL);
        }finally {
            if(resource!=null){
                resource.close();
            }
        }
    }
    @RequestMapping("editPassword")
    public Result editPassword(@RequestBody LoginInfo loginInfo){
//       对验证码进行判断
        Jedis resource=null;
        try {
            resource = jedisPool.getResource();
//            第一步每次手机号提交过来都判断该手机号是否被封
            String flag = resource.get(loginInfo.getTelephone()+"009");
            if(flag!=null){
                return new Result(false,"操作频繁请五分钟后重试");
            }
//            第二步：判断用于提交是否超过次数，对超过次数的手机号进行封号
            String count = resource.get(loginInfo.getTelephone()+"count");
            if(count!=null&&Integer.parseInt(count)==0){
//                此时用户次数用完需要封号,同时清空次数
                resource.setex(loginInfo.getTelephone()+"009",60*5,"flag");
                resource.set(loginInfo.getTelephone()+"count","3");
                return new Result(false,"操作频繁请五分钟后重试");
            }
//            第三步：即用户第一次提交
            if(count==null){
                resource.set(loginInfo.getTelephone()+"count","3");
            }
            count = resource.get(loginInfo.getTelephone() + "count");
//            将次数减一
            int number=Integer.parseInt(count)-1;
            resource.set(loginInfo.getTelephone()+"count",""+number);
            
//        第一步:1.进行验证码校验
            String telephone = loginInfo.getTelephone();
            String code = loginInfo.getValidateCode();
//            2.从redis中取出保存的验证码
            String s = resource.get(telephone + RedisMessageConstant.SENDTYPE_GETPWD);
//            这里是验证码出现的问题有三种，一种是客户没有输入验证码，第二种是验证码失效，第三种是输出验证码错误
//           这里分别进行判断
            if(telephone==null||code==null){
                return new Result(false,MessageConstant.TELEPHONE_VALIDATECODE_NOTNULL);
            }
            if(s==null){
                return new Result(false,"验证码已失效");
            }
            if(!s.equals(code)){
                return new Result(false,MessageConstant.VALIDATECODE_ERROR);
            }
//            执行到这里说明校验都通过了可以进行修改
//            对密码进行加盐加密,将修改过后的账号和密码进行设置
            String encode = bCryptPasswordEncoder.encode(loginInfo.getPassword());
            loginInfo.setPassword(encode);
            editUserService.editUser(loginInfo);


//        客户端写入cookie，值为手机号，使用cookie的目的是为了跟踪用户，
//            1.创建cookie
            Cookie cookie = new Cookie("telephone",telephone);
//            2.设置cookie的存活时间,存活一个月
            cookie.setMaxAge(60*60*24*30);
//            3.设置cookie在服务器共享
            cookie.setPath("/");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(resource!=null){
                resource.close();
            }
        }
        return new Result(true,"修改成功");
    }
}
